/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
import xmlaufgabe7.UebungData;

/**
 * Model nach MVC. Speichert wichtige Daten zum Herunterladen markierter Dateien
 * und laedt diese nacheinander in einem eigenen Thread herunter.
 * 
 * @author s0527676
 */
public class DownloadModel extends Observable implements Runnable {
    
    /**
     * Liste mit herunterzuladenden URLs
     */
    private ArrayList<String> urls;
    
    /**
     * Allgemeiner Pfadteil zum Speichern der Dateien
     */
    private String path;
    
    /**
     * Aktuelle Wert der Teilgroesse der heruntergeladenen Datei
     */
    private int byteWritten;
    
    /**
     * Thread
     */
    private Thread thread;
    
    /**
     * List mit den Groessen der Dateien
     */
    private int[] fileSize;
    
    /**
     * Initialisierung aller Felder und starten des Threads.
     * 
     * @param url URL Liste
     * @param path Allgemeiner Daateipfad
     */
    public DownloadModel(ArrayList<String> url, String path) {
        this.urls = url;
        this.path = path;
        thread = new Thread(this);
        byteWritten = 0;
        fileSize = new int[urls.size()];
        
        thread.start();
    }
    
    /**
     * Herunterladen aller Dateien in einem separaten Thread.
     */
    public void run() {
        for(int i = 0; i < urls.size(); i++) {
            String[] name = urls.get(i).split("ueb/\\d/");
            
            try {
                URL url = new URL(urls.get(i));
                URLConnection connection = url.openConnection();
                connection.setRequestProperty("User-Agent", "Adrian Cieluch s0527676");
                fileSize[i] = connection.getContentLength();
                InputStream input = connection.getInputStream();
                OutputStream output = new BufferedOutputStream(new FileOutputStream(path + "\\" + name[1]));
                byte[] buffer = new byte[1024];
                int byteRead = 0;

                while ((byteRead = input.read(buffer)) != -1) {
                    output.write(buffer, 0, byteRead);
                    byteWritten += byteRead;
                    
                    this.setChanged();
                    this.notifyObservers(i);
                }

                input.close();
                output.close();
                byteWritten = 0;
            } catch (IOException ex) {
                Logger.getLogger(DownloadModel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    /**
     * Gibt eine URL an Hand des Index zurueck.
     * 
     * @param index Index
     * @return URL
     */
    public String getURLByIndex(int index) {
        return urls.get(index);
    }
    
    /**
     * Gibt die Anzahl der URLs zurueck.
     * 
     * @return Anzahl der URLs
     */
    public int getURLSize() {
        return urls.size();
    }
    
    /**
     * Gibt das Dateigroessen Array zurueck.
     * @return Dateigroessen Array
     */
    public int[] getFileSizes() {
        return fileSize;
    }
    
    /**
     * Gibt den Wert der aktuellen Teilgroesse der heruntergeladenen Datei zurueck.
     * @return Wert der aktuellen Teilgroesse der heruntergeladenen Datei
     */
    public int getByteWritten() {
        return byteWritten;
    }
}
